<?php

namespace Common\Service;


/** 
 * 用户操作  用于显示动态
 * @author Legend. <xcx_legender@qq.com>
 * @param 
 * @return 
 */

Class UsersService extends BaseService
{

    protected $_validate = array(
        /* 验证用户名 */
        array('username', '1,64', '用户名不合法', self::EXISTS_VALIDATE, 'length'), //用户名长度不合法
        array('username', '', '用户名已存在', self::EXISTS_VALIDATE, 'unique'), //用户名被占用
        // array('nickname', '1,10', '昵称不合法', self::VALUE_VALIDATE, 'length'),
        array('nickname', '', '昵称被占用', self::VALUE_VALIDATE, 'unique'),
    );

    /* 用户模型自动完成 */
    protected $_auto = array(
        // array('password', 'think_ucenter_md5', self::MODEL_INSERT, 'function', UC_AUTH_KEY),
        array('reg_time', NOW_TIME, self::MODEL_INSERT),
        array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
        array('update_time', NOW_TIME),
        array('referral', 'createUserReferral', self::MODEL_INSERT, 'callback'),
        array('login', 0, self::MODEL_INSERT),
        array('login', 'intval', self::MODEL_BOTH, 'function'),
        array('type', 2, self::MODEL_INSERT),
        array('type', 'intval', self::MODEL_BOTH, 'function'),
        array('status', 1, self::MODEL_INSERT),
        array('status', 'intval', self::MODEL_BOTH, 'function'),
        // array('avatar', '', self::MODEL_INSERT),
        array('background', '', self::MODEL_INSERT),
        array('score', 0, self::MODEL_INSERT),
        array('score', 'intval', self::MODEL_BOTH, 'function'),
        array('level', 1, self::MODEL_INSERT),
        array('level', 'intval', self::MODEL_BOTH, 'function'),
        array('exp', 0, self::MODEL_INSERT),
        array('exp', 'intval', self::MODEL_BOTH, 'function'),
        array('turtial', 0, self::MODEL_INSERT),
        array('turtial', 'intval', self::MODEL_BOTH, 'function'),
        // array('platform', 0, self::MODEL_INSERT),
    );

    /**
     * 检测用户名是不是被禁止注册
     * @param  string $username 用户名
     * @return boolean          ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMember($username){
        return true; //TODO: 暂不限制，下一个版本完善
    }

    /**
     * 检测邮箱是不是被禁止注册
     * @param  string $email 邮箱
     * @return boolean       ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyEmail($email){
        return true; //TODO: 暂不限制，下一个版本完善
    }

    /**
     * 检测手机是不是被禁止注册
     * @param  string $mobile 手机
     * @return boolean        ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMobile($mobile){
        return true; //TODO: 暂不限制，下一个版本完善
    }

    /**
     * 根据配置指定用户状态
     * @return integer 用户状态
     */
    protected function getStatus(){
        return true; //TODO: 暂不限制，下一个版本完善
    }

    /**
     * 注册一个新用户
     * @param  string $username 用户名
     * @param  string $password 用户密码
     * @param  string $email    用户邮箱
     * @param  string $mobile   用户手机号码
     * @return integer          注册成功-用户信息，注册失败-错误编号
     */
    public function register($username, $password, $mobile, $nickname = '', $extend){
        $data = array(
            'username' => $username,
            'password' => think_ucenter_md5($password, UC_AUTH_KEY),
        );
        $mobile && $data['mobile'] = $mobile;
        !empty($nickname) && $data['nickname'] = $nickname;
        //验证手机
        /* 添加用户 */
        $extend && $data = array_merge($data, $extend);
        if($data = $this->create($data)){
            $uid = $this->add($data);
            return $uid ? $uid : 0; //0-未知错误，大于0-注册成功
        } else {
            return -1; //错误详情见自动验证注释
        }
    }

    /**
     * 用户登录认证
     */
    public function login($username, $password, $force = false){
        $map['username'] = $username;
        $user = $this->where($map)->find();
        if($user && $user['status'] == 1){
            /* 验证用户密码 */
            if($force || think_ucenter_md5($password, UC_AUTH_KEY) === $user['password']){
                $this->updateLogin($user['id']); //更新用户登录信息
                return $user['id']; //登录成功，返回用户ID
            } else {
                return -2; //密码错误
            }
        } else {
            return -1; //用户不存在或被禁用
        }
    }

    /**
     * 获取用户信息
     * @param  string  $uid         用户ID或用户名
     * @param  boolean $is_username 是否使用用户名查询
     * @return array                用户信息
     */
    public function info($uid, $is_username = false){
        $map = array();
        if($is_username){ //通过用户名获取
            $map['username'] = $uid;
        } else {
            $map['id'] = (int)$uid;
        }

        // 添加sso_channel liubo 2016-7-15
        $field = 'id,username,email,mobile,status,reg_time,sso_channel';
        $user = $this->where($map)->field($field)->find();
        return $user ?: null;
    }

    // 获取详细信息
    // 返回值添加password字段 by liubo at 2016-05-26
    public function detail($uid, $is_username = false)
    {
        $map = array();
        if($is_username){ //通过用户名获取
            $map['username'] = $uid;
        } else {
            $map['id'] = (int)$uid;
        }

        $user = $this->where($map)->field('id,username,password,email,mobile,status,reg_time')->find();
        return $user ?: null;
    }


    /**
     * 检测用户信息
     * @param  string  $field  用户名
     * @param  integer $type   用户名类型 1-用户名，2-用户邮箱，3-用户电话
     * @return integer         错误编号
     */
    public function checkField($field, $type = 1){
        $data = array();
        switch ($type) {
            case 1:
                $data['username'] = $field;
                break;
            case 2:
                $data['email'] = $field;
                break;
            case 3:
                $data['mobile'] = $field;
                break;
            default:
                return 0; //参数错误
        }

        return $this->create($data) ? 1 : $this->getError();
    }

    public function updateInfo($uid, $password, $data)
    {
        if($this->updateUserFields($uid, $password, $data) !== false){
            $return['status'] = true;
        }else{
            $return['status'] = false;
            $return['info'] = $this->getError();
        }
        return $return;
    }


    /**
     * 更新用户登录信息
     * @param  integer $uid 用户ID
     */
    public function updateLogin($uid){
        $data = array(
            'id'              => (int)$uid,
            'last_login_time' => NOW_TIME,
            'login'           => ['inc', '1'],
            'last_login_ip'   => get_client_ip(1),
        );
        $this->save($data);
    }

    /**
     * 更新用户信息
     * @param int $uid 用户id
     * @param string $password 密码，用来验证
     * @param array $data 修改的字段数组
     * @return true 修改成功，false 修改失败
     * @author huajie <banhuajie@163.com>
     */
    public function updateUserFields($uid, $password, $data, $check=true){
        $uid = (int)$uid;
        if(empty($uid) || empty($data)){
            $this->error = '参数错误！';
            return false;
        }
        if($check){
            if(empty($password)){
                $this->error = '参数错误！';
                return false;
            }
             //更新前检查用户密码
            if(!$this->verifyUser($uid, $password)){
                $this->error = '原密码不正确！';
                return false;
            }
        }

        //更新用户信息
        if (!empty($data['password'])){
            $data['password'] = think_ucenter_md5($data['password'], UC_AUTH_KEY);
        }
        // $data = $this->create($data);
        if($data){
            $res = $this->where(array('id'=>$uid))->save($data);
            return $res;
        }
        return false;
    }

    /**
    *重置密码
    *@param int $uid 用户标识
    *@param array $data 更新的密码信息
    *@return boolean true|成功 false|失败
    *@author susy.liang <susy.liang@ilongyuan.com.cn>
    */
    public function resetPwd($uid, $data){
        return $this->updateUserFields($uid, '', $data, false);
    }

    /**
     * 验证用户密码
     * @param int $uid 用户id
     * @param string $password_in 密码
     * @return true 验证成功，false 验证失败
     * @author huajie <banhuajie@163.com>
     */
    protected function verifyUser($uid, $password_in){
        $password = $this->find($uid)['password'];
        if(think_ucenter_md5($password_in, UC_AUTH_KEY) === $password){
            return true;
        }
        return false;
    }

    protected function createUserReferral($data)
    {
        return substr( md5($data['uid'] . NOW_TIME . rand(1000,9999)), 8, 16 );
    }


}